package cn.xyy.system.service;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSONObject;
import cn.xyy.common.domain.system.auth.UserInfo;
import cn.xyy.common.domain.system.online.OnlineUser;
import cn.xyy.common.domain.system.online.OnlineUserFilter;
import cn.xyy.common.utils.BeanUtils;
import cn.xyy.common.utils.StringUtils;
import cn.xyy.web.AuthUserHolder;
import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.stp.StpUtil;
import cn.xyy.common.domain.mvc.Page;

/**
 * 在线用户业务
 * 
 * @author xyy
 *
 */
@Service
public class OnlineUserService {

	public List<OnlineUser> getAll() {
		List<String> keyList = SaManager.getSaTokenDao().searchData(AuthUserHolder.splicingKeyUser(""), "", 0, -1,
				false);
		if (keyList == null || keyList.isEmpty()) {
			return null;
		}
		List<OnlineUser> onlineUserList = new ArrayList<OnlineUser>();

		for (String e : keyList) {
			UserInfo user = JSONObject.parseObject(SaManager.getSaTokenDao().get(e), UserInfo.class);
			Object loginId = StpUtil.getLoginIdByToken(user.getToken());
			OnlineUser onlineUser = null;
			if (user != null && loginId != null) {
				onlineUser = new OnlineUser();
				BeanUtils.copyProperties(user, onlineUser);
				onlineUser.setIp(user.getClientInfo().getIp());
				onlineUser.setLoginTime(user.getClientInfo().getLoginTime());
				onlineUserList.add(onlineUser);
			}
		}
		return onlineUserList;
	}

	public List<OnlineUser> filter(String filter) {
		List<OnlineUser> onlineUserList = getAll();
		if (onlineUserList == null || onlineUserList.isEmpty()) {
			return null;
		}
		if (StringUtils.isNotBlank(filter)) {
			onlineUserList = onlineUserList.stream().filter(e -> e.toString().contains(filter))
					.collect(Collectors.toList());
		}
		return onlineUserList;
	}

	public Page<OnlineUser> onlineUser(OnlineUserFilter filter) {

		List<OnlineUser> onlineUserList = filter(filter.getFilter());
		if (onlineUserList == null || onlineUserList.isEmpty()) {
			return null;
		}
		List<OnlineUser> onlineUserListPage = onlineUserList.stream()
				.sorted(Comparator.comparing(OnlineUser::getLoginTime).reversed()).skip(filter.getPage() - 1)
				.limit(filter.getLimit()).collect(Collectors.toList());

		Page<OnlineUser> page = new Page<OnlineUser>(onlineUserListPage, onlineUserList.size(), filter.getLimit(),
				filter.getPage());
		return page;
	}

	public void kickoutByToken(String token) {
		if (StringUtils.isBlank(token)) {
			return;
		}
		StpUtil.kickoutByTokenValue(token);
		AuthUserHolder.destroyUser(token);

	}

	public void kickoutByUId(String uid) {
		if (StringUtils.isBlank(uid)) {
			return;
		}
		List<OnlineUser> onlineUserList = filter(uid);
		if (onlineUserList == null || onlineUserList.isEmpty()) {
			return;
		}
		onlineUserList.stream().forEach(e -> {
			if (e.getUid().equals(uid)) {
				kickoutByToken(e.getToken());
			}
		});
	}

}
